package com.tham.dao;

import java.io.IOException;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import oracle.jdbc.driver.OracleTypes;

import org.apache.log4j.Logger;

import utiles.AppProperties;
import utiles.ConexionPool;

import com.fic.dto.EvolucionDTO;
import com.fic.vo.EvolucionVO;
import com.fic.vo.TratamIngresoVO;
import com.tham.dto.SolicitudDTO;
import com.tham.vo.SolicitudVO;


public class SolicitudDAO {
	
	private static Logger log = Logger.getLogger(SolicitudDAO.class);
	String pkgVar = (AppProperties.getProperty("aplicacion", "PACKAGE"));
	
	public  List<SolicitudDTO> getSolicitud(String idProf, String fecAct, String fecIni, String estado, String paciente, String doctor, String tipo) throws SQLException, IOException{
		Connection conn = ConexionPool.getConnectionPool();	
		List<SolicitudDTO> listaSolicitudes = new ArrayList<SolicitudDTO>();
		try {
			String query = "{ call "+pkgVar+".PKG_FIC_SOLICITUD_2.getSolRcc(?,?,?,?,?,?,?,?) }"; 	       
			CallableStatement  stmt = conn.prepareCall(query);
			stmt.setString(1,idProf);
			stmt.setString(2,fecAct);			
			stmt.setString(3,fecIni);
			stmt.setString(4,estado);
			stmt.setString(5,paciente);
			stmt.setString(6,doctor);
			stmt.setString(7,tipo);
			stmt.registerOutParameter(8, OracleTypes.CURSOR);
			stmt.execute();
			ResultSet rs = (ResultSet)stmt.getObject(8);
			while (rs.next()) {
				SolicitudDTO solitudReceta = new SolicitudDTO();				
				solitudReceta.setIdSolRcc(rs.getString(1));
				
				//String a = new SimpleDateFormat("dd/mm/yyyy").format(rs.getDate(2));
				
				solitudReceta.setFecDigitacion(rs.getString(2));
				solitudReceta.setRut(rs.getString(3));
				solitudReceta.setRutDv(rs.getString(4));
				solitudReceta.setPaciente(rs.getString(5));
				solitudReceta.setSolicitud(rs.getString(6));
				solitudReceta.setEstado(rs.getString(7));						
				solitudReceta.setProfesional(rs.getString(8));
				solitudReceta.setDireccion(rs.getString(9));
				solitudReceta.setTelefonos(rs.getString(10));
				solitudReceta.setIdProfesional(rs.getString(11));
				solitudReceta.setFecNacimiento(rs.getString(13));
				solitudReceta.setComuna(rs.getString(14));
				solitudReceta.setEdad(rs.getString(15));
				solitudReceta.setUsuarioIng(rs.getString(16));
				solitudReceta.setIdEstado(rs.getString(17));
				solitudReceta.setObservaciones(rs.getString(18));
				solitudReceta.setIdPaciente(rs.getString(19));
				solitudReceta.setIdTipoSol(rs.getString(20));
				solitudReceta.setObsProf(rs.getString(21));
				solitudReceta.setIdProfAsig(rs.getString(22));
				listaSolicitudes.add(solitudReceta);				
			}
			rs.close();
			stmt.close();
		} catch (SQLException ex) {  
			log.error("Error SolicitudDAO.getSolicitud SQLException: " +ex.getMessage());
			System.out.println(ex.getMessage());
		} finally {
			conn.close();
			conn = null;
		}
		return listaSolicitudes;		
	} 
	public  List<SolicitudDTO> getUltMedByPacMed(String idProf, String idPaciente) throws SQLException, IOException{
		Connection conn = ConexionPool.getConnectionPool();	    
		List<SolicitudDTO> listMatriz = new ArrayList<SolicitudDTO>();
		try {
			String query = "{ call "+pkgVar+".PKG_FIC_SOLICITUD_2.getUltMedByPacMed(?,?,?) }"; 	       
			CallableStatement  stmt = conn.prepareCall(query);
			stmt.setString(1, idProf);
			stmt.setString(2, idPaciente);
			stmt.registerOutParameter(3, OracleTypes.CURSOR);
			stmt.execute();
			ResultSet rs = (ResultSet)stmt.getObject(3);
			while (rs.next()) {
				SolicitudDTO evolDTO = new SolicitudDTO();				
				evolDTO.setIdMedEvol(rs.getString(1));
				evolDTO.setIdMedicamento(rs.getString(2));		
				evolDTO.setMedicamento(rs.getString(3));
				evolDTO.setCantidad(rs.getString(4));
				evolDTO.setVia(rs.getString(5));
				evolDTO.setDosis(rs.getString(6));
				listMatriz.add(evolDTO);				
			}
			rs.close();
			stmt.close();
		} catch (SQLException ex) {  
			log.error("Error SolicitudDAO.getUltMedByPacMed SQLException: " +ex.getMessage());
			System.out.println(ex.getMessage());
		} finally {
			conn.close();
			conn = null;
		}
		return listMatriz;		
	}		
	
	public List<SolicitudDTO> getCargaProfPac(String idPac, String tipoLista) throws SQLException, IOException{
		Connection conn = ConexionPool.getConnectionPool();    
		List<SolicitudDTO> listaProfesional = new ArrayList<SolicitudDTO>();
		try {
			String query = "{ call "+pkgVar+".PKG_FIC_SOLICITUD_2.getMedByPac(?,?,?) }"; 	   
			CallableStatement  stmt = conn.prepareCall(query);
			stmt.setString(1,idPac);
			stmt.setString(2,tipoLista);
			stmt.registerOutParameter(3, OracleTypes.CURSOR);
			stmt.execute();
			ResultSet rs = (ResultSet)stmt.getObject(3);
			while (rs.next()) {
				SolicitudDTO listProf = new SolicitudDTO();
				listProf.setIdProfAsig(rs.getString(1));	
				listProf.setProfesional(rs.getString(2));				
				listaProfesional.add(listProf);
			}
			rs.close();
			stmt.close();
		} catch (SQLException ex) {  
			log.error("Error SolicitudDAO.getCargaProfPac SQLException: " +ex.getMessage());
			System.out.println(ex.getMessage());
		} finally {
			conn.close();
			conn = null;
		}
		return listaProfesional;

	}	
	
	public  List<SolicitudDTO> setUpdateEst(String idSolRcc, String idEstado, String hoy, String idUsu , String xObs) throws SQLException, IOException{
		Connection conn = ConexionPool.getConnectionPool();   
		List<SolicitudDTO> listMatriz = new ArrayList<SolicitudDTO>();
		try {
			String query = "{ call "+pkgVar+".PKG_FIC_SOLICITUD_2.setUpdateEst(?,?,?,?,?,?) }"; 	       
			CallableStatement  stmt = conn.prepareCall(query);
			stmt.setString(1,idSolRcc);
			stmt.setString(2,idEstado);
			stmt.setString(3,hoy);
			stmt.setString(4,idUsu);
			stmt.setString(5,xObs);
			stmt.registerOutParameter(6, OracleTypes.INTEGER);	
			stmt.execute();
			SolicitudDTO solRcc = new SolicitudDTO();
			solRcc.setIdSolRcc(stmt.getString(6));
			System.out.println(stmt.getString(6));
			listMatriz.add(solRcc);		
			stmt.close();
		} catch (SQLException ex) {  
			log.error("Error SolicitudDAO.setUpdateEst SQLException: " +ex.getMessage());
			System.out.println(ex.getMessage());

		} finally {
			conn.close();
			conn = null;
		}
		return listMatriz;		
	}	
	
	public  List<SolicitudDTO> setEditObservaciones(String Obs, String idSolEnc) throws SQLException, IOException{
		Connection conn = ConexionPool.getConnectionPool();   
		List<SolicitudDTO> listMatriz = new ArrayList<SolicitudDTO>();
		try {
			String query = "{ call "+pkgVar+".PKG_FIC_SOLICITUD_2.setEditObservaciones(?,?,?) }"; 	       
			CallableStatement  stmt = conn.prepareCall(query);
			stmt.setString(1, Obs);
			stmt.setString(2, idSolEnc);
			stmt.registerOutParameter(3, OracleTypes.INTEGER);					
			stmt.execute();
			SolicitudDTO solRcc = new SolicitudDTO();
			solRcc.setIdSolRcc(stmt.getString(3));
			listMatriz.add(solRcc);		
			stmt.close();
		} catch (SQLException ex) {  
			log.error("Error SolicitudDAO.setEditObservaciones SQLException: " +ex.getMessage());
			System.out.println(ex.getMessage());

		} finally {
			conn.close();
			conn = null;
		}
		return listMatriz;		
	} 	

	public  List<SolicitudDTO> setEncSol(SolicitudVO solEncSol) throws SQLException, IOException{
		Connection conn = ConexionPool.getConnectionPool();   
		List<SolicitudDTO> listMatriz = new ArrayList<SolicitudDTO>();
		try {
			String query = "{ call "+pkgVar+".PKG_FIC_SOLICITUD_2.setEncSolicitud(?,?,?,?,?,?,?,?,?) }"; 	       
			CallableStatement  stmt = conn.prepareCall(query);
			stmt.setString(1, solEncSol.getIdEstado());
			stmt.setString(2, solEncSol.getIdPaciente());
			stmt.setString(3, solEncSol.getIdProfesional());
			stmt.setString(4, solEncSol.getIdUsuario());
			stmt.setString(5, solEncSol.getFecDigitacion());
			stmt.setString(6, solEncSol.getIdTipo());
			stmt.setString(7, solEncSol.getObservaciones());
			stmt.setString(8, solEncSol.getIdProfAsig());
			stmt.registerOutParameter(9, OracleTypes.INTEGER);					
			stmt.execute();
			SolicitudDTO solRcc = new SolicitudDTO();
			solRcc.setIdSolRcc(stmt.getString(9));
			listMatriz.add(solRcc);		
			stmt.close();
		} catch (SQLException ex) {  
			log.error("Error SolicitudDAO.setEncSol SQLException: " +ex.getMessage());
			System.out.println(ex.getMessage());

		} finally {
			conn.close();
			conn = null;
		}
		return listMatriz;		
	}	
	
	public  List<SolicitudDTO> setSolicitud(SolicitudVO solSolicitud) throws SQLException, IOException{
		Connection conn = ConexionPool.getConnectionPool(); 
		List<SolicitudDTO> listMatriz = new ArrayList<SolicitudDTO>();
		try {
			String query = "{ call "+pkgVar+".PKG_FIC_SOLICITUD_2.setSolicitud(?,?,?,?,?,?,?) }"; 	       
			CallableStatement  stmt = conn.prepareCall(query);
			stmt.setString(1, solSolicitud.getIdMedEvol());
			stmt.setString(2, solSolicitud.getRecetas());
			stmt.setString(3, solSolicitud.getMeses());
			stmt.setString(4, solSolicitud.getObservaciones());
			stmt.setString(5, solSolicitud.getIdEnc());
			stmt.setString(6, solSolicitud.getIdSolRcc());
			stmt.registerOutParameter(7, OracleTypes.INTEGER);					
			stmt.execute();
			SolicitudDTO solRcc = new SolicitudDTO();
			solRcc.setIdSolRcc(stmt.getString(7));
			listMatriz.add(solRcc);		
			stmt.close();
		} catch (SQLException ex) {  
			log.error("Error EvolucionDAO.setNewEvolucion SQLException: " +ex.getMessage());
			System.out.println(ex.getMessage());

		} finally {
			conn.close();
			conn = null;
		}
		return listMatriz;		
	}
	
	public  List<SolicitudDTO> setDelMedicamentos(String idSolRcc) throws SQLException, IOException{
		Connection conn = ConexionPool.getConnectionPool(); 
		List<SolicitudDTO> listMatriz = new ArrayList<SolicitudDTO>();
		try {
			String query = "{ call "+pkgVar+".PKG_FIC_SOLICITUD_2.setDelMed(?,?) }"; 	       
			CallableStatement  stmt = conn.prepareCall(query);
			stmt.setString(1, idSolRcc);
			stmt.registerOutParameter(2, OracleTypes.INTEGER);					
			stmt.execute();
			SolicitudDTO solRcc = new SolicitudDTO();
			solRcc.setIdSolRcc(stmt.getString(2));
			listMatriz.add(solRcc);		
			stmt.close();
		} catch (SQLException ex) {  
			log.error("Error SolicitudDAO.setDelMedicamentos SQLException: " +ex.getMessage());
			System.out.println(ex.getMessage());

		} finally {
			conn.close();
			conn = null;
		}
		return listMatriz;		
	}		
	
	//Migrar este metodo al portal 2
	public  List<EvolucionDTO> setNewEvolucion(EvolucionVO evolucionVO) throws SQLException, IOException{
		Connection conn = ConexionPool.getConnectionPool(); 
		List<EvolucionDTO> listMatriz = new ArrayList<EvolucionDTO>();
		try {
			String query = "{ call "+pkgVar+".PKG_FIC_EVOLUCION.setNewEvolucion(?,?,?,?,?,?) }"; 	       
			CallableStatement  stmt = conn.prepareCall(query);
			stmt.setString(1, evolucionVO.getIdPAC());
			stmt.setString(2, evolucionVO.getIdTipoAtencion());
			stmt.setString(3, evolucionVO.getIdUser());
			stmt.setString(4, evolucionVO.getControl());
			stmt.setString(5, evolucionVO.getOrigen());
			stmt.registerOutParameter(6, OracleTypes.INTEGER);					
			stmt.execute();
			EvolucionDTO evol = new EvolucionDTO();
			evol.setIdEvolucion(stmt.getString(6));
			listMatriz.add(evol);		
			stmt.close();
		} catch (SQLException ex) {  
			log.error("Error SolicitudDAO.setNewEvolucion SQLException: " +ex.getMessage());
			System.out.println(ex.getMessage());

		} finally {
			conn.close();
			conn = null;
		}
		return listMatriz;		
	}	
	public  List<EvolucionDTO> setInsMedEvolucion(TratamIngresoVO tratamIngVO) throws SQLException, IOException{
		Connection conn = ConexionPool.getConnectionPool(); 
		List<EvolucionDTO> listMatriz = new ArrayList<EvolucionDTO>();
		try {
			String query = "{ call "+pkgVar+".PKG_FIC_MEDICAMENTO_EVOLUCION.setInsMedEvolucion(?,?,?,?,?,?,?,?,?,?) }"; 	       
			CallableStatement  stmt = conn.prepareCall(query);
			stmt.setString(1, tratamIngVO.getIdPaciente());
			stmt.setString(2, tratamIngVO.getIdEvolucion());
			stmt.setString(3, tratamIngVO.getIdMedEvol());
			stmt.setString(4, tratamIngVO.getMedicamento());			
			stmt.setString(5, tratamIngVO.getIdMedicamento());
			stmt.setString(6, tratamIngVO.getDosis());
			stmt.setString(7, tratamIngVO.getVia());
			stmt.setString(8, tratamIngVO.getCantidad());
			stmt.setString(9, tratamIngVO.getTiempo());
			stmt.registerOutParameter(10, OracleTypes.INTEGER);					
			stmt.execute();
			EvolucionDTO evol = new EvolucionDTO();
			evol.setIdEvolucion(stmt.getString(10));
			listMatriz.add(evol);		
			stmt.close();
		} catch (SQLException ex) {  
			log.error("Error SolicitudDAO.setInsMedEvolucion SQLException: " +ex.getMessage());
			System.out.println(ex.getMessage());

		} finally {
			conn.close();
			conn = null;
		}
		return listMatriz;		
	}
	
	public List<SolicitudDTO> getSolicitudDet(String idSolEnc) throws SQLException, IOException{
		Connection conn = ConexionPool.getConnectionPool(); 		    
		List<SolicitudDTO> listMatriz = new ArrayList<SolicitudDTO>();
		try {
			String query = "{ call "+pkgVar+".PKG_FIC_SOLICITUD_2.getSolicitud(?,?) }"; 	       
			CallableStatement  stmt = conn.prepareCall(query);
			stmt.setString(1,idSolEnc);
			stmt.registerOutParameter(2, OracleTypes.CURSOR);
			stmt.execute();
			ResultSet rs = (ResultSet)stmt.getObject(2);
			while (rs.next()) {
				SolicitudDTO solitudReceta = new SolicitudDTO();				
				solitudReceta.setIdSolRcc(rs.getString(1));
				solitudReceta.setIdSolEnc(rs.getString(2));
				solitudReceta.setIdMedEvol(rs.getString(3));
				solitudReceta.setRecetas(rs.getString(4));
				solitudReceta.setMeses(rs.getString(5));
				//solitudReceta.setObservaciones(rs.getString(6));
				solitudReceta.setMedicamento(rs.getString(6));
				solitudReceta.setCantidad(rs.getString(7));
				solitudReceta.setVia(rs.getString(8));
				solitudReceta.setDosis(rs.getString(9));
				//solitudReceta.setIdEstado(rs.getString(10));
				//solitudReceta.setIdUsuario(rs.getString(12));
				
				listMatriz.add(solitudReceta);				
			}
			rs.close();
			stmt.close();
		} catch (SQLException ex) {  
			log.error("Error SolicitudDAO.getSolicitudDet SQLException: " +ex.getMessage());
			System.out.println(ex.getMessage());
		} finally {
			conn.close();
			conn = null;
		}
		return listMatriz;		
	}  	
	
	public  List<SolicitudDTO> getUltMedByPacMedSol(String idProf, String idPaciente, String idSolRcc) throws SQLException, IOException{
		Connection conn = ConexionPool.getConnectionPool();  
		List<SolicitudDTO> listMatriz = new ArrayList<SolicitudDTO>();
		try {
			String query = "{ call "+pkgVar+".PKG_FIC_MEDICAMENTO_EVOLUCION.getUltMedByPacMedSol(?,?,?,?) }"; 	       
			CallableStatement  stmt = conn.prepareCall(query);
			stmt.setString(1, idProf);
			stmt.setString(2, idPaciente);
			stmt.setString(3, idSolRcc);
			stmt.registerOutParameter(4, OracleTypes.CURSOR);
			stmt.execute();
			ResultSet rs = (ResultSet)stmt.getObject(4);
			while (rs.next()) {
				SolicitudDTO solitudReceta = new SolicitudDTO();				
				solitudReceta.setIdSolRcc(rs.getString(1));
				solitudReceta.setIdSolEnc(rs.getString(2));
				solitudReceta.setIdMedEvol(rs.getString(3));
				solitudReceta.setRecetas(rs.getString(4));
				solitudReceta.setMeses(rs.getString(5));
				//solitudReceta.setObservaciones(rs.getString(6));
				solitudReceta.setMedicamento(rs.getString(6));
				solitudReceta.setCantidad(rs.getString(7));
				solitudReceta.setVia(rs.getString(8));
				solitudReceta.setDosis(rs.getString(9));	
				solitudReceta.setSel(rs.getString(10));
				listMatriz.add(solitudReceta);				
			}
			rs.close();
			stmt.close();
		} catch (SQLException ex) {  
			log.error("Error Evolucion.getUltMedByPac SQLException: " +ex.getMessage());
			System.out.println(ex.getMessage());
		} finally {
			conn.close();
			conn = null;
		}
		return listMatriz;		
	}	
	
	public  List<SolicitudDTO> getUltProxControl(String idPaciente) throws SQLException, IOException{
		Connection conn = ConexionPool.getConnectionPool();  
		List<SolicitudDTO> listMatriz = new ArrayList<SolicitudDTO>();
		try {
			String query = "{ call "+pkgVar+".PKG_FIC_SOLICITUD_2.getProximosControles(?,?) }"; 	       
			CallableStatement  stmt = conn.prepareCall(query);
			stmt.setString(1, idPaciente);
			stmt.registerOutParameter(2, OracleTypes.CURSOR);
			stmt.execute();
			ResultSet rs = (ResultSet)stmt.getObject(2);
			while (rs.next()) {
				SolicitudDTO solitudReceta = new SolicitudDTO();				
				solitudReceta.setFechaControl(rs.getString(1));
				solitudReceta.setProfesional(rs.getString(3));
				solitudReceta.setEstado(rs.getString(4));
				solitudReceta.setIdEvol(rs.getString(5));
				listMatriz.add(solitudReceta);				
			}
			rs.close();
			stmt.close();
		} catch (SQLException ex) {  
			log.error("Error SolicitudDAO.getUltProxControl SQLException: " +ex.getMessage());
			System.out.println(ex.getMessage());
		} finally {
			conn.close();
			conn = null;
		}
		return listMatriz;		
	}	
	
}
